package com.nowcoder.topic.dp.middle;

/**
 * NC116 把数字翻译成字符串
 * @author d3y1
 */
public class NC116{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    public int solve (String nums) {
        return solution(nums);
    }

    /**
     * 动态规划
     *
     * dp[i]表示前i位数字的译码种数
     *
     *         { 0                  , 单双数字均不可译码
     * dp[i] = { dp[i-2]            , 仅双位数字可以译码
     *         { dp[i-1]            , 仅单位数字可以译码
     *         { dp[i-1] + dp[i-2]  , 单双数字均可以译码
     *
     * @param nums
     * @return
     */
    private int solution(String nums){
        int len = nums.length();
        if(len == 0){
            return 0;
        }
        if(len == 1){
            if("0".equals(nums)){
                return 0;
            }else{
                return 1;
            }
        }

        int[] dp = new int[len+1];
        // 初始化
        dp[0] = 1;
        dp[1] = 1;
        int dDigit,sDigit;
        for(int i=2; i<=len; i++){
            // 双位数字 double digit
            dDigit = Integer.parseInt(nums.substring(i-2, i));
            // 单位数字 single digit
            sDigit = Integer.parseInt(nums.substring(i-1, i));
            // 当前第i位数字为0 单位数字不可译码
            if(sDigit == 0){
                // 超出字母范围 双位数字不可译码
                if(dDigit==0 || dDigit>26){
                    return 0;
                }else{
                    // 双位数字译码
                    dp[i] = dp[i-2];
                }
            }else{
                // 单位数字译码
                dp[i] = dp[i-1];
                // 未超字母范围 双位数字可译码 (注意 01 02 03 04 05 06 07 08 09 不可译码)
                if(10 <= dDigit && dDigit <= 26){
                    // 双位数字译码
                    dp[i] += dp[i-2];
                }
            }
        }

        return dp[len];
    }
}